package 多线程;
import 面向对象.*;
import java.util.concurrent.*;

public class X07线程池
{
	public static void main(String[]args){
		MyRunnable6 mr6=new MyRunnable6();
		/*创建单线程池,创建一个使用单个 worker 线程的 Executor，
		以无界队列方式来运行该线程。（注意，如果因为在关闭前的执行期间出现失败而终止了此单个线程，那么如果需要，一个新线程将代替它执行后续的任务）。
		可保证顺序地执行各个任务，并且在任意给定的时间不会有多个线程是活动的。
		与其他等效的 newFixedThreadPool(1) 不同，可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
		*/
		ExecutorService es1=Executors.newSingleThreadExecutor();
		//es1.execute(mr6);
		//es1.execute(mr6);
		es1.shutdown();
		/*
		 创建固定大小的线程池
		 每次添加一个任务就添加一个线程直到设置的最大线程数，
		 然后执行完一个后添加一个新的
		*/
		ExecutorService esf=Executors.newFixedThreadPool(2);
		//esf.execute(mr6);
		//esf.execute(mr6);
		esf.shutdown();
		/*
		创建一个可缓存的线程池
		 创建一个可根据需要创建新线程的线程池，
		 但是在以前构造的线程可用时将重用它们。
		 对于执行很多短期异步任务的程序而言，这些线程池通常可提高程序性能。
		 调用 execute 将重用以前构造的线程（如果线程可用）。
		 如果现有线程没有可用的，则创建一个新线程并添加到池中。
		 终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
		 因此，长时间保持空闲的线程池不会使用任何资源。
		 注意，可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同（例如超时参数）的线程池。
		
		*/
		ExecutorService esc=Executors.newCachedThreadPool();
		//esc.execute(mr6);
		//esc.execute(mr6);
		esc.shutdown();
		/*
		 创建一个(指定大小)线程池，它可安排在给定延迟后运行命令或者定期地执行。
		*/
		ScheduledExecutorService ses=Executors.newScheduledThreadPool(2);
		//ses.execute(mr6);
		//ses.execute(mr6);
		ses.schedule(mr6,3000,TimeUnit.MILLISECONDS);//延迟3秒执行
		ses.shutdown();
	}
}
class MyRunnable6 implements Runnable
{

	@Override
	public void run()
	{
		for(int i=0;i<5;i++){
			System.out.println(Thread.currentThread().getName()+"==="+i);
			try
			{
				Thread.sleep(300);
			}
			catch (InterruptedException e)
			{}
		}
	}
}
